<?php

include_once ENTITIES."cargo.php";
include_once ENTITIES."perfil.php";
include_once ENTITIES."funcionario.php";
include_once ENTITIES."telefone.php";

include_once MODELS."cargo.php";
include_once MODELS."perfil.php";
include_once MODELS."funcionario.php";
include_once MODELS."telefone.php";

class FuncionarioController {
    
    private $modelCargo;
    private $modelPefil;
    private $modelFucionario;
    private $modelTelefone;
    
    public function __construct() {
        $this->modelCargo = new CargoModel();
        $this->modelPefil = new PerfilModel();
        $this->modelFucionario = new FuncionarioModel();
        $this->modelTelefone = new TelefoneModel();
    }
    
    public function getAllCargos(){
        return $this->modelCargo->select();
    }
    
    public function getCargo($id_cargo){
        $cargo = $this->modelCargo->select("*", CargoModel::ID."= $id_cargo");
        if(!empty($cargo)) return $cargo[0];
        return new Cargo();
    }
    
    public function getAllPerfis($noAdmin = false){
        $condition = null;
        if($noAdmin) $condition = PerfilModel::ID." <> ".PERFIL_ADMINISTRADOR;
        return $this->modelPefil->select("*", $condition);
    }
    
    public function getPerfil($id_perfil){
        if(empty($id_perfil)) return new Perfil();
        $perfil = $this->modelPefil->select("*", PerfilModel::ID."= $id_perfil");
        if(!empty($perfil)) return $perfil[0];
        return new Perfil();
    }

    public function getAllCobradores($byloja = false){
        if($byloja) {
            $condition = FuncionarioModel::CARGO." = ".CargoModel::COD_COBRADOR;
            $condition .= " AND ".FuncionarioModel::LOJA." = ".$byloja;
        } else {
            $condition = FuncionarioModel::CARGO." = ".CargoModel::COD_COBRADOR;
        }
        return $this->modelFucionario->select("*", $condition);
    }
    
    public function getAllOculistas(){
        $condition = FuncionarioModel::CARGO." = ".CargoModel::COD_COBRADOR;
        return $this->modelFucionario->select("*", $condition);
    }
    
    public function getAllGerentes(){
        $condition = FuncionarioModel::CARGO." = ".CargoModel::COD_GERENTE; 
        return $this->modelFucionario->select("*", $condition);
    }
    
    public function getAllVendedores($byloja = false){
        if($byloja) {
            $condition = FuncionarioModel::CARGO." = ".CargoModel::COD_VENDEDOR;
            $condition .= " AND ".FuncionarioModel::LOJA." = ".$byloja;
        } else {
            $condition = FuncionarioModel::CARGO." = ".CargoModel::COD_VENDEDOR;
        }
        return $this->modelFucionario->select("*", $condition);
    }
    
    public function getAllAgentesVenda($byloja = false){
        if($byloja) {
            $condition = FuncionarioModel::CARGO." = ".CargoModel::COD_AGENTE;
            $condition .= " AND ".FuncionarioModel::LOJA." = ".$byloja;
        } else {
            $condition = FuncionarioModel::CARGO." = ".CargoModel::COD_AGENTE;
        }
        return $this->modelFucionario->select("*", $condition);
    }
    
    public function addFuncionario(Funcionario $funcionario = null){
        if(is_null($funcionario)){
            $funcionario = new Funcionario();
            $this->linkFuncionario($funcionario);
        }
        global $config;
        if(empty($funcionario->nome) || empty($funcionario->cpf) || 
           empty($funcionario->rg) || empty($funcionario->cargo) || 
           empty($funcionario->loja) ){
            
            $config->failInFunction("Os campos: Nome, CPF, RG e Cargo, são necessários para inserção");
        }
        $hasId = $config->filter("for-update-id");
        $res = false;
        $resTel = true;
        if(empty($hasId)){
            $res = $this->modelFucionario->insert($funcionario);
            if($res) {
                foreach ($funcionario->telefones as $telefone){
                    $telefone->dono = $res;
                }
                $resTel = empty($funcionario->telefones) ? true : $this->modelTelefone->insert(TelefoneModel::TABLE_FUNC, $funcionario->telefones);
            }
        } else {
            $funcionario->id = $hasId;
            $res = $this->modelFucionario->update($funcionario);
            foreach ($funcionario->telefones as $telefone){
                $telefone->dono = $funcionario->id;
            }
            if(empty($funcionario->telefones)){
                $reslTel = $this->modelTelefone->delete(TelefoneModel::TABLE_FUNC, $funcionario->id);
            } else
                $resTel =  $this->modelTelefone->delete(TelefoneModel::TABLE_FUNC, $funcionario->id) && 
                           $this->modelTelefone->insert(TelefoneModel::TABLE_FUNC, $funcionario->telefones);
        }
        if($res){
            $message = ($resTel) ? null : "Porém telefones não foram inseridos";
            $config->successInFunction($message);
        } else {
            $config->failInFunction($this->modelFucionario->handleError());
        }
        $config->redirect("index.php?op=cad-func");
    }
    
    private function linkFuncionario(Funcionario &$funcionario){
        global $config;
        $funcionario->nome = mb_strtoupper($config->filter("nome"), 'UTF-8');
        $funcionario->login = mb_strtoupper($config->filter("login"), 'UTF-8');
        $funcionario->senha = mb_strtoupper($config->filter("senha"), 'UTF-8');
        $funcionario->nascimento = $config->filter("nascimento");
        $funcionario->admissao = $config->filter("admissao");
        $funcionario->demissao = $config->filter("demissao");
        $funcionario->cidade = $config->filter("cidade");
        $funcionario->rua = mb_strtoupper($config->filter("rua"), 'UTF-8');
        $funcionario->numero = $config->filter("numero");
        $funcionario->bairro = mb_strtoupper($config->filter("bairro"), 'UTF-8');
        $cep = $config->filter("cep");
        $funcionario->cep = str_replace(array(".","-"), "", $cep);
        $cpf = $config->filter("cpf");
        $funcionario->cpf = str_replace(array(".","-"), "", $cpf);
        $funcionario->rg = $config->filter("rg");
        $funcionario->cpt = $config->filter("cpt");
        $funcionario->referencia = mb_strtoupper($config->filter("referencia"), 'UTF-8');
        $funcionario->banco = mb_strtoupper($config->filter("banco"), 'UTF-8');
        $funcionario->agencia = $config->filter("agencia");
        $funcionario->conta = $config->filter("conta");
        $funcionario->cargo = $config->filter("cargo");
        $funcionario->loja = $config->filter("loja");
        $funcionario->perfil = $config->filter("perfil");
        $funcionario->email = mb_strtoupper($config->filter("email"), 'UTF-8');
        $funcionario->telefones = array();
        $i = 1;
        $telefone = $config->filter("telefone-$i");
        while(!is_null($telefone)){
            if(!empty($telefone)){
                $tel = str_replace(array("(",")","-"," "), "", $telefone);
                $funcionario->telefones[] = new Telefone($tel);
            }
            $i++;
            $telefone = $config->filter("telefone-$i");
        }
    }
    
    public function removeFuncionario(){
        global $config;
        $id_func = $config->filter("func");
        if(isset($id_func)){
            $res = $this->modelFucionario->delete($id_func);
            if($res){
                $message = null;
                if(!$this->modelTelefone->delete(TelefoneModel::TABLE_FUNC, $id_func))
                    $message = "Porém telefones não foram apagados";
                $config->successInFunction($message);
            } else {
                $config->failInFunction($this->modelFucionario->handleError());
            }   
        } else {
            $config->failInFunction("Funcionário não informada");
        }
        $config->redirect("?op=cad-func");
    }
    
    public function getAllFuncionarios($foreign_values = false, $byLoja = false){
        $condition = null;
        if($byLoja) $condition = FuncionarioModel::LOJA." = $byLoja";
        if($foreign_values){
            return $this->modelFucionario->superSelect($condition);
        }
        return $this->modelFucionario->select(" * ", $condition);
    }
    
    public function getFuncionario($id_func_or_login, $senha_login = ""){
        if(empty($senha_login)) 
            $condition = FuncionarioModel::ID."= $id_func_or_login";
        else 
            $condition = FuncionarioModel::LOGIN." = '$id_func_or_login' AND ".FuncionarioModel::SENHA." = '$senha_login'";
        $funcionario = $this->modelFucionario->select("*", $condition);
        if(!empty($funcionario)) return $funcionario[0];
        return new Funcionario();
    }
    
    public function getAllTelefonesOfFuncionario($func_id){
        $condition = TelefoneModel::FUNCIONARIO." = $func_id";
        return $this->modelTelefone->select(TelefoneModel::TABLE_FUNC,$condition);
    }
}

?>
